package com.dollar.ruyuan_juc.nonLockImpl.immutable.sourceCode;

/**
 * CopyOnWriteArrayList的源码中运用了不可变对象模式，
 * 使得集合在进行遍历操作的时候，不用加锁也能保证线程安全。
 * <p>
 * 体会：其线程安全性体现在哪里
 * 回头看看：实例变量array就是一个等效不可变对象？
 * 我们仔细思考一下，在array对象每次被创建之后，其内容就不再被改变。（数组的长度和每个元素都不变）。
 * 另外就算我们对CopyOnWriteArrayList进行集合元素的增删，这里也不是直接改变原数组的元素，
 * 而是直接新建了一个新的数组，替换掉array对象。在这个时候，旧的那个数组还是没有改变过。
 * <p>
 * 写时复制的最终目的是为了在读多写少的场景，通过写时复制的机制，
 * 让大量的读请求在无需加锁牺牲性能的情况下保证多线程并发读写的情况下线程安全。
 * <p>
 * CopyOnWriteArrayList的一个特点：弱一致性。意思就是说线程1看到的是某一时刻的一份“快照数据”，
 * 无法保证能读取到最新的数据。
 * <p>
 * 应用：
 * egisterDriver方法，实际上是往registerDrivers中添加了一个DriverInfo对象，
 * 而registerDrivers就是一个CopyOnWriteArrayList。
 */
public class CopyOnWriteArrayListTest {
}
